
/**
 * 游戏基础的精灵类
 */
export default class Sprite {
  constructor(imgSrc = '', width = 0, height = 0, spriteFrameWidth = 0) {
    // 使用微信小游戏的图片API
    this.img = wx.createImage();
    this.img.src = imgSrc;

    this.width = width;
    this.height = height;

    // 当前sprite帧的宽度，用于处理精灵图
    this.spriteFrameWidth = spriteFrameWidth || width;

    this.x = 0;
    this.y = 0;

    this.visible = true;
    this.animating = false;
    this.currentFrame = 0;
    this.totalFrames = this.spriteFrameWidth ? Math.floor(this.img.width / this.spriteFrameWidth) : 1;
  }

  /**
   * 将精灵图绘制在canvas上
   */
  drawToCanvas(ctx) {
    if (!this.visible) return;

    // 计算当前帧在精灵图中的x坐标
    const sx = this.currentFrame * this.spriteFrameWidth;

    ctx.drawImage(
      this.img,
      sx,          // 源图像的x坐标
      0,           // 源图像的y坐标
      this.spriteFrameWidth, // 源图像的宽度
      this.height, // 源图像的高度
      this.x,      // 目标canvas的x坐标
      this.y,      // 目标canvas的y坐标
      this.width,  // 绘制到canvas上的宽度
      this.height  // 绘制到canvas上的高度
    );
  }

  /**
   * 简单的碰撞检测定义：
   * 另一个精灵的中心点处于本精灵所在的矩形内即可
   * @param{Sprite} sp: Sprite的实例
   */
  isCollideWith(sp) {
    if (!this.visible || !sp.visible) return false;

    const spX = sp.x + sp.width / 2;
    const spY = sp.y + sp.height / 2;

    return !!(spX >= this.x
              && spX <= this.x + this.width
              && spY >= this.y
              && spY <= this.y + this.height);
  }
}